// 什么是联合类型
//    type 联合类型 = 类型1 | 类型2
// 接口的作用是什么
//    声明一组参数 可以有多种类型
// type 和 interface什么区别
//    相同点 描述 数据 类型  不同点  type 可以声明基本类型 联合类型 元组  interface 有 extends 属性
// 怎么定义可选属性
//    ?
// in 关键字的作用
//    检测 某个属性是否在 实例中
// 泛型 <T>

type NS = string | number;

let a: NS;

// 类 一种面向对象编程语言的结构

class Greeter {
  // static  声明的属性或者方法 不再属于实例 this   属于类本身
  static cname: string = 'Greeter';
  // #name :string es6 如果想声明私有变量

  // ts的私有变量
  private name: string = '小蓝'; // 目的 : 只允许 每部调用 axios
  public aname: string;
  protected bname: string; // 受保护的 借鉴的是 c# java
  public _fullName: string;

  // 成员属性
  greeting: string = '123';// es7
  constructor(message: string) {
    // 成员属性
    this.greeting = message

  }

  static getClassName() {
    return 'Classname is Greeter'
  }

  getName() {
    return this.name;
  }

  // get fullName():string{ // Object.defineProperty
  //   return this._fullName
  // }
  // set fullName (newName:string){
  //   console.log('set');
  //   this._fullName = newName;
  // }

}

console.log(Greeter.cname);
console.log(Greeter.getClassName());
let greeter = new Greeter('小红');
// console.log(greeter.fullName = '123');
// console.log(greeter.getName());


class Animal {
  name: string;

  constructor(theName: string) {
    this.name = theName;
  }

  move(distance: number) {
    console.log(`${this.name} move ${distance} 米`);
  }
}

class Snake extends Animal {
  constructor(name: string) {
    super(name)// 只要继承  调用父类的构造
  }

  move(distance) {
    // 调用父类的方法
    // this.
    // Animal.
    // Snake.
    // Animal实例.

    // Snake.move() ×
    // this.move(10) // 死循环
    super.move(20);// super animal 实例 只能调用父类的方法
  }
}

let snake = new Snake('王牌眼镜蛇');

snake.move(10);

//多态 抽象类  抽象方法

// 声明抽象类  abstract :抽象类的关键字
abstract class Person { // 里面不需要写具体的代码
  constructor(public name: string) {
  }

  abstract say(word: string): void // 没有方法体  抽象 : 温柔 善良 贤惠
}

// 实现类
class Liu extends Person {
  constructor(name: string) {
    super(name)
  }

  say(word: string): void {
    console.log(`${word} 眼睛 温柔`);
    console.log(`${word} 性格 善良`);
    console.log(`${word} 做饭 贤惠`);
  }

  say1(word: string): void {
    console.log(`${word} 眼睛 温柔`);
    console.log(`${word} 性格 善良`);
    console.log(`${word} 做饭 贤惠`);
  }

  // say1(word: string, age?: number): string {
  //   console.log(`${word} ${age} 眼睛 温柔`);
  //   console.log(`${word} ${age} 性格 善良`);
  //   console.log(`${word} ${age} 做饭 贤惠`);
  //   return `${word} 做饭 贤惠`;
  // }

}

let liu = new Liu('刘天一');
liu.say('刘天一');
// liu.say1('高钰松', 20);
// 多态 人 移情别恋
// 多态: 多个方法 都叫同一个名字 参数或者返回值不同 就叫多态


// 喜欢的人
// 属性 name  age  size  sex
// like play eat drink la
// 写一个抽象类 然后具体给实现出来
// 预习 webpack + react + ts 环境




